// #include<iostream>
// using namespace std;
// int main()
// {
//     char ch;
//     cin << ch;
//     string str;
//     while(1)
//     {
//         if(str == "@")
//         {
//             break;
//         }
//         else
//         {
//         cin << str;

//         }
//     } 
//     return 0;
// }


//方法一：直接用sort()函数
//#include <iostream>
//#include <vector>
//#include <string>
//#include <algorithm>
//
//using namespace std;
//
//// 删除字符串中特定字符的函数
//string removeChar(const string& str, char ch) {
//    string result;
//    for (char c : str) {
//        if (c!= ch && c!= ch + 32 && c!= ch - 32) {
//            result += c;
//        }
//    }
//    return result;
//}
//
//int main() {
//    char targetChar;
//    cin >> targetChar;
//
//    vector<string> strs;
//    string input;
//    while (cin >> input && input!= "@") {
//        strs.push_back(input);
//    }
//
//    vector<string> newStrs;
//    for (const string& str : strs) {
//        newStrs.push_back(removeChar(str, targetChar));
//    }
//
//    sort(newStrs.begin(), newStrs.end(), greater<string>());//直接调用sort()函数实现逆序
//
//    for (const string& str : newStrs) {
//        cout << str << endl;
//    }
//
//    return 0;
//}




//方法二：把sort函数改成用模版函数和冒泡排序法实现字符串的逆序
#include <iostream>
#include <vector>
#include <string>
using namespace std;

// 比较函数模板
template<typename T>
bool reverseCompare(const T& a, const T& b) {//比较两个任意类型的变量的大小
    return a > b;//返回一个布尔类型的值表示ab的大小关系
}

/*删除传入的字符串str中的指定字符ch以及与该字符大小写不敏感对应的
字符（ch + 32是小写字母对应的大写字母或者大写字母对应的小写字母，反之ch - 32也是同理），然后返回删除指定字符后的新字符串*/
string removeChar(const string& str, char ch) {//接受一个字符串和字符型的参数；
//在 C++ 中，std::string虽然在概念上可以看作是一种特殊的字符容器，但它和标准容器类（如std::vector、std::list等）有一些不同的特性和用法。
    string result;
    for (char c : str) {
        if (c!= ch) {//将不等于指定的字符ch的字符赋值（或者说接到result后面，就是说这一步的作用就是剔除字符串中的指定字符，然后将剃除了指定字符之后的新的字符串存到result中）
            result += c;//连接
        }
    }
    return result;
}

int main() {
    char targetChar;
    cin >> targetChar;

    vector<string> strs;//设置一个容器，用于可以连续实现存入多个字符串
    string input;//定义一个字符串变量
    while (cin >> input && input!= "@") {//输入字符串变量的值，并判断字符串是否为结束标志的字符
        strs.push_back(input);//push_back是vector容器的成员函数，用于在vector的末尾添加一个元素,意思就是可以使用push_back()函数来把input字符串存入strs容器里
    }
    
  /*使用循环体调出strs容器里的每一个字符串，将这些字符串传递到removeChar函数里剔除掉指定字符的元素之后再返回新的字符串通过push_back存到newStrs容器里*/
    vector<string> newStrs;//重新设置一个容器用于存储删除字符之后的新的字符串
    for (const string& str : strs) {//str是一个const string&类型的引用，它在每次循环迭代中依次引用strs容器中的一个字符串元素
  
        newStrs.push_back(removeChar(str, targetChar));//把删了指定字符的新的字符串逐个放进上面新定义的容器newStrs里
    }

    // 使用冒泡排序进行逆序排序
	//(题目里的逆序排序就是从首字母开始比较字符串，首字母字符大的排在前面，如果首字母一样则比较第二个字母的ASCII码值，如首字母大小比较类推)
    for (size_t i = 0; i < newStrs.size(); ++i) {//size_t是 C++ 语言中定义的一种数据类型，它是一种无符号整数类型，通常用于表示对象的大小、数组的索引等
        for (size_t j = i + 1; j < newStrs.size(); ++j) {//容器的大小也可以使用.size()函数来得到
            if (!reverseCompare(newStrs[i], newStrs[j])) {//逆序：从大到小排序，所以取非；容器名.[索引]可以找到容器里对应位置的值
                string temp = newStrs[i];
                newStrs[i] = newStrs[j];
                newStrs[j] = temp;
            }
        }
    }
    
//容器里的内容不能直接循环输出
/*不能直接输出容器的原因：
在 C++ 中，标准容器类（如vector）没有定义直接输出整个容器内容的操作符。不像一些基本数据类型可以直接用cout输出，容器类对象不能这样简单地输出。
例如，如果你尝试直接cout << newStrs;，编译器会报错，因为没有为vector<string>类型定义合适的输出操作符。*/
    for (const string& str : newStrs) {
        cout << str << endl;
    }

    return 0;
}
